工控網(wǎng)首頁
>

應(yīng)用設(shè)計(jì)

>

ARM平臺基于嵌入式Linux Gstreamer 使用

ARM平臺基于嵌入式Linux Gstreamer 使用

1). 簡介

隨著ARM平臺性能的日益強(qiáng)大和嵌入式設(shè)備的發(fā)展,對于多媒體處理如音視頻播放,攝像頭,流媒體處理等需求也日益增多,本文就通過幾個(gè)基于嵌入式Linux下多媒體應(yīng)用的示例來簡單展示下使用Gstreamer框架進(jìn)行多媒體處理的方法.

Gstreamer是一個(gè)基于Pipeline的多媒體框架,基于GObject,以C語言寫成,目前是嵌入式Linux最為常用的處理多媒體應(yīng)用框架. Element是Gstreamer最重要和基本的對象類,通過Plugin的形式提供,多個(gè)Elements可以組合為bin,并進(jìn)一步聚合形成一個(gè)Pipeline完成一個(gè)多媒體應(yīng)用處理.

2). 硬件準(zhǔn)備

./ 本文測試所使用平臺為ToradexColibri i.MX6 ARM計(jì)算機(jī)核心板模塊, 基于NXP i.MX6 SoC, 配合Colibri開發(fā)板.

./ 攝像頭作為多媒體輸入源使用Logitech720P USB攝像頭

3). 軟件準(zhǔn)備

./ OS為Toradex官方Y(jié)cotoproject兼容嵌入式Linux發(fā)布 V2.5 beta3.

./ Gstreamer-0.10, 系統(tǒng)自帶

./ 安裝gstreamer相關(guān)插件包

----------------

root@colibri-imx6:~# opkg update

root@colibri-imx6:~# opkg installgst-plugins-base-meta gst-plugins-good-meta

root@colibri-imx6:~# wget http://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavcodec54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# wgethttp://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# wgethttp://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavutil52_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# wgethttp://feeds.angstrom-distribution.org/feeds/v2015.06/ipk/glibc/armv7ahf-vfp-neon/base/libavformat54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg installlibavutil52_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg installlibavcodec54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg installlibswscale2_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg installlibavformat54_9.16-r0.9_armv7ahf-vfp-neon.ipk

root@colibri-imx6:~# opkg installgst-ffmpeg

----------------

4). 測試gstreamer

Gstreamer提供了兩個(gè)非常方便的工具gst-launch和gst-inspect,在真正將Gstreamerpipeline集成到你的程序里面前,可以使用這兩個(gè)工具在命令行下面進(jìn)行pipeline的準(zhǔn)備和測試,本文也主要基于這種模式進(jìn)行演示,而詳細(xì)的關(guān)于Gstreamer在程序中使用方法請參考這里.

gst-inspect可以用來查看當(dāng)前系統(tǒng)已經(jīng)安裝的plugin或者具體查看某個(gè)element的屬性來判定pipeline中elements互聯(lián)兼容性,詳細(xì)說明請見這里.

gst-launch 用于編譯和運(yùn)行一個(gè)pipeline,可以方便的對pipeline進(jìn)行不同組合嘗試并測試,如下面用來顯示一個(gè)視頻測試圖案.

----------------

root@colibri-imx6:~# gst-launch videotestsrc! 'video/x-raw-rgb, width=(int)640,height=(int)480' ! ximagesink

----------------

5). 應(yīng)用示例

a). 播放攝像頭

使用v4l2src元件采集攝像頭視頻,視頻格式為YUY2/幀率30/分辨率640x480; 使用imxv4l2sink元件利用GPU加速播放采集的視頻; 如果使用ximagesink元件來播放則沒有硬件加速.

----------------

root@colibri-imx6:~# gst-launch v4l2srcdevice=/dev/video0 ! 'video/x-raw-yuv, framerate=30/1, width=(int)640,height=(int)480, format=(fourcc)YUY2' ! imxv4l2sink disp-width=640disp-height=480

----------------

目標(biāo)板CPU占用率: 37.5%

b). 采集攝像頭保存為文件

同樣使用v4l2src元件采集攝像頭視頻; ffmpegcolorspace元件轉(zhuǎn)換顏色格式為I420; vpuenc元件調(diào)用硬件VPU進(jìn)行H.264編碼; matroskamux元件進(jìn)行mkv mux;  filesink元件輸出到文件

----------------

root@colibri-imx6:~# gst-launch -v v4l2srcdevice=/dev/video0 ! ffmpegcolorspace ! 'video/x-raw-yuv, framerate=30/1,width=(int)640, height=(int)480, format=(fourcc)I420' ! queue max-size-buffers=2! vpuenc codec=6 ! matroskamux ! filesink location=output.mkv

----------------

目標(biāo)板CPU占用率: 40%

c). 回放視頻文件

使用filesrc元件讀取視頻文件; aiurdemux元件進(jìn)行demux; vpudec元件通過硬件VPU進(jìn)行H.264解碼; imxv4l2sink元件播放.

----------------

root@colibri-imx6:~# gst-launch filesrclocation=/home/root/output.mkv typefind=true ! aiurdemux ! queue ! vpudec !imxv4l2sink disp-width=640 disp-height=480

----------------

目標(biāo)板CPU占用率: 3.5%

d).RTP攝像頭流媒體到遠(yuǎn)程主機(jī)

使用v4l2src元件采集攝像頭; ffmpegcolorspace轉(zhuǎn)換顏色格式; vpuenc元件調(diào)用硬件VPU進(jìn)行H.264編碼;rtph264pay元件進(jìn)行h264流rtp封裝; udpsink元件進(jìn)行udp傳輸.

----------------

//Ubuntu主機(jī)IP: 10.20.1.116

//Colibri i.MX6目標(biāo)板IP: 10.20.1.122

/* Colibri i.MX6 */

gst-launch -v v4l2src device=/dev/video0 !ffmpegcolorspace! 'video/x-raw-yuv, framerate=30/1, width=(int)640,height=(int)480, format=(fourcc)I420' ! vpuenc codec=6 ! rtph264pay ! udpsinkhost=10.20.1.116 port=5000

/* Ubuntu 主機(jī) */

//Ubuntu 14.04, 安裝gstreamer-ffmpeg

wgethttp://ppa.launchpad.net/mc3man/gstffmpeg-keep/ubuntu/pool/main/g/gstreamer0.10-ffmpeg/gstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb&& sudo dpkg -igstreamer0.10-ffmpeg_0.10.13-5ubuntu1~trusty2.1_amd64.deb

//播放流媒體, caps設(shè)置從目標(biāo)板獲得

gst-launch-0.10 udpsrc port=5000caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264, sprop-parameter-sets=(string)\"Z0JAHqaAoD2QAA\\=\\=\\,aM44gAA\\=\",payload=(int)96, ssrc=(uint)1172839120, clock-base=(uint)784846202,seqnum-base=(uint)58343" ! rtph264depay ! ffdec_h264 ! ximagesink

----------------

目標(biāo)板CPU占用率: 35%

6). Gstreamer1.0應(yīng)用示例

Colibri i.MX6 最新Linux發(fā)布版本V2.6beta1已經(jīng)支持gstreamer1.0,升級方法請見這里

./ 軟件準(zhǔn)備

安裝相關(guān)插件包

----------------

opkg update

opkg install gstreamer1.0-plugins-base-meta

opkg install gstreamer1.0-plugins-good-meta

opkg remove --force-dependslibgstimxcompositor0 //目前版本中需要移除否則無法使用gstreamer

----------------

./ 應(yīng)用示例

a). 播放攝像頭

----------------

root@colibri-imx6:~# gst-launch-1.0 imxv4l2srcdevice=/dev/video0 ! 'video/x-raw, framerate=30/1, width=(int)640,height=(int)480, format=(string)YUY2' ! imxv4l2sink overlay-width=640 overlay-height=480

----------------

目標(biāo)板CPU占用率: 30%

b).  采集攝像頭保存為文件

----------------

root@colibri-imx6:~# gst-launch-1.0 imxv4l2srcdevice=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1,width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2! vpuenc_h264 ! matroskamux ! filesink location=output.mkv

----------------

目標(biāo)板CPU占用率: 16%

c). 回放視頻文件

----------------

root@colibri-imx6:~# gst-launch-1.0 filesrclocation=/home/root/output.mkv typefind=true ! matroskademux ! queue ! vpudec !imxv4l2sink overlay-width=640 overlay-height=480

----------------

目標(biāo)板CPU占用率: 4%

d).RTP攝像頭流媒體到遠(yuǎn)程主機(jī)

----------------

//Ubuntu主機(jī)IP: 10.20.1.116

//Colibri i.MX6目標(biāo)板IP: 10.20.1.122

/* Colibri i.MX6 */

gst-launch-1.0 imxv4l2srcdevice=/dev/video0 ! videoconvert ! 'video/x-raw, framerate=30/1,width=(int)640, height=(int)480, format=(string)I420' ! queue max-size-buffers=2! vpuenc_h264 ! rtph264pay ! udpsink host=10.20.1.116 port=5000

/* Ubuntu 主機(jī) */

//Ubuntu 14.04, 安裝libav (0.10 ffmpeg)

sudo apt-get install gstreamer1.0-libav

//播放流媒體

gst-launch-1.0 udpsrc port=5000caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264,payload=(int)96" ! rtph264depay ! avdec_h264 ! videoconvert ! ximagesink

----------------

目標(biāo)板CPU占用率: 13%

e). 攝像頭連接到遠(yuǎn)程主機(jī)tcp視頻流到目標(biāo)版再rtp回遠(yuǎn)程主機(jī)播放

----------------

//Ubuntu主機(jī)IP: 10.20.1.116

//Colibri i.MX6目標(biāo)板IP: 10.20.1.122

/* Ubuntu 主機(jī) */

//采集攝像頭并建立tcp server

gst-launch-1.0 v4l2src device=/dev/video0 !videoconvert ! 'video/x-raw, framerate=30/1, width=(int)640, height=(int)480,format=(string)I420' ! jpegenc ! tcpserversink host=10.20.1.116 port=5000

/* Colibri i.MX6 */

//tcp server獲取攝像頭視頻流,并進(jìn)行H.264壓縮后rtp回遠(yuǎn)程主機(jī)

gst-launch-1.0 tcpclientsrchost=10.20.1.116 port=5000 ! jpegdec ! queue max-size-buffers=2 ! vpuenc_h264 !rtph264pay ! udpsink host=10.20.1.116 port=5001

/* Ubuntu 主機(jī) */

//播放rtp視頻流

gst-launch-1.0 udpsrc port=5001caps="application/x-rtp, media=(string)video, clock-rate=(int)90000,encoding-name=(string)H264,payload=(int)96" ! rtph264depay ! avdec_h264 ! videoconvert ! ximagesink

----------------

目標(biāo)板CPU占用率: 31%

7). 總結(jié)

由上面示例可見Gstreamer是一個(gè)非常強(qiáng)大且配置靈活的多媒體處理框架,并且配合相應(yīng)的plugin,也可以充分調(diào)用硬件GPU/VPU加速,使其能夠在嵌入式設(shè)備上面利用有限的資源高效的實(shí)現(xiàn)廣泛的多媒體應(yīng)用.

投訴建議

提交

查看更多評論
其他資訊

查看更多

Verdin AM62 LVGL 移植

基于 NXP iMX8MM 測試 Secure Boot 功能

隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊

Verdin iMX8MP 調(diào)試串口更改

NXP iMX8MM Cortex-M4 核心 GPT Capture 測試